package br.com.dev.tcc.database.dao;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Locale;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import br.com.dev.tcc.bean.Apolice;
import br.com.dev.tcc.bean.Corretor;
import br.com.dev.tcc.bean.Lembrete;
import br.com.dev.tcc.bean.Plano;
import br.com.dev.tcc.bean.Segurado;
import br.com.dev.tcc.bean.Veiculo;
import br.com.dev.tcc.database.DatabaseHelper;

public class ApoliceDAO {

	private final DatabaseHelper databaseHelper;

	public ApoliceDAO(DatabaseHelper databaseHelper) {

		this.databaseHelper = databaseHelper;
	}

	public List<Apolice> lista() {

		List<Apolice> lista = new ArrayList<Apolice>();

		SQLiteDatabase db = databaseHelper.getWritableDatabase();
		Cursor cursor = db
				.rawQuery(
						"select AP.id as id_apolice, AP.hash, AP.lembrete_ipva, AP.lembrete_licenca, "
								+ "AP.lembrete_rodizio, AP.vencimento, SE.nome, PL.id as plano_id, PL.descricao, "
								+ "VE.modelo, VE.cor, VE.placa, C.id as id_corretor, VE.id as id_veiculo, "
								+ "SE.id as id_segurado "
								+ "FROM segurado as SE join apolice as AP on "
								+ "AP.id_segurado=SE.id join plano PL on AP.id_plano=PL.id join veiculo as "
								+ "VE on VE.id=AP.id_veiculo "
								+ "join corretor as C on AP.id_corretor=C.id",
						null);

		for (int i = 0; i < cursor.getCount(); i++) {

			cursor.moveToNext();

			Apolice apolice = new Apolice();
			apolice.setId(cursor.getInt(cursor.getColumnIndex("id_apolice")));
			apolice.setHash(cursor.getString(cursor.getColumnIndex("hash")));
			apolice.setVencimento(getCalendar(cursor.getString(cursor
					.getColumnIndex("vencimento"))));

			Lembrete lembrete = new Lembrete();
			lembrete.setDate(getCalendar(cursor.getString(cursor
					.getColumnIndex("lembrete_ipva"))));
			apolice.setLembreteIpva(lembrete);
			lembrete = new Lembrete();
			lembrete.setDate(getCalendar(cursor.getString(cursor
					.getColumnIndex("lembrete_licenca"))));
			apolice.setLembreteLicenca(lembrete);
			lembrete = new Lembrete();
			lembrete.setDate(getCalendar(cursor.getString(cursor
					.getColumnIndex("lembrete_rodizio"))));
			apolice.setLembreteRodizio(lembrete);

			Segurado s = new Segurado();
			s.setId(Integer.parseInt(cursor.getString(cursor
					.getColumnIndex("id_segurado"))));
			s.setNome(cursor.getString(cursor.getColumnIndex("nome")));
			apolice.setSegurado(s);

			Plano p = new Plano();
			p.setDescricao(cursor.getString(cursor.getColumnIndex("descricao")));
			p.setId(cursor.getInt(cursor.getColumnIndex("plano_id")));
			apolice.setPlano(p);

			Veiculo v = new Veiculo();
			v.setId(Integer.parseInt(cursor.getString(cursor
					.getColumnIndex("id_veiculo"))));
			v.setModelo(cursor.getString(cursor.getColumnIndex("modelo")));
			v.setPlaca(cursor.getString(cursor.getColumnIndex("placa")));
			v.setCor(cursor.getString(cursor.getColumnIndex("cor")));
			apolice.setVeiculo(v);

			Corretor corretor = new Corretor();
			corretor.setId(Integer.parseInt(cursor.getString(cursor
					.getColumnIndex("id_corretor"))));
			apolice.setCorretor(corretor);

			lista.add(apolice);
		}

		cursor.close();

		db.close();

		return lista;
	}

	private Calendar getCalendar(String date) {

		if (date == null)
			return null;

		Calendar calendar = Calendar.getInstance();

		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd",
				Locale.getDefault());

		try {
			calendar.setTime(format.parse(date));
		} catch (ParseException e) {
			return null;
		}

		return calendar;
	}

	public boolean salva(Apolice apolice) {

		int idPlano = apolice.getPlano().getId();

		Segurado segurado = apolice.getSegurado();
		SeguradoDAO seguradoDao = new SeguradoDAO(databaseHelper);
		int idSegurado = seguradoDao.salva(segurado);

		Veiculo veiculo = apolice.getVeiculo();
		VeiculoDAO veiculoDao = new VeiculoDAO(databaseHelper);
		int idVeiculo = veiculoDao.salva(veiculo);

		Corretor corretor = apolice.getCorretor();
		CorretorDAO corretorDao = new CorretorDAO(databaseHelper);
		int idCorretor = corretorDao.salva(corretor);

		ContentValues values = new ContentValues();
		values.put("hash", apolice.getHash());
		values.put("id", apolice.getId());
		values.put("vencimento", getDatetime(apolice.getVencimento()));
		values.put("id_segurado", idSegurado);
		values.put("id_plano", idPlano);
		values.put("id_veiculo", idVeiculo);
		values.put("id_corretor", idCorretor);

		SQLiteDatabase database = databaseHelper.getWritableDatabase();

		try {
			long resultado = database.insertOrThrow("apolice", null, values);

			return resultado > -1;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			database.close();
		}
	}

	private String getDatetime(Calendar date) {

		if (date == null)
			return null;

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",
				Locale.getDefault());

		return sdf.format(date.getTime());
	}

	public boolean salvaLembretes(Apolice apolice) {

		ContentValues values = new ContentValues();

		if (apolice.getLembreteIpva() != null)
			values.put("lembrete_ipva", getDatetime(apolice.getLembreteIpva()
					.getDate()));

		if (apolice.getLembreteLicenca() != null)
			values.put("lembrete_licenca", getDatetime(apolice
					.getLembreteLicenca().getDate()));

		if (apolice.getLembreteRodizio() != null)
			values.put("lembrete_rodizio", getDatetime(apolice
					.getLembreteRodizio().getDate()));

		SQLiteDatabase database = databaseHelper.getWritableDatabase();

		long resultado = database.update("apolice", values, "id=?",
				new String[] { Integer.toString(apolice.getId()) });

		database.close();
		
		return resultado > 0;
	}

	public boolean removerApolice(Apolice apolice) {

		SinistroDAO sinistroDAO = new SinistroDAO(databaseHelper);
		long resultado = sinistroDAO.removerTodosPorApolice(apolice.getId());

		SQLiteDatabase database = databaseHelper.getWritableDatabase();

		resultado = database.delete("apolice", "id=?",
				new String[] { Integer.toString(apolice.getId()) });

		CorretorDAO corretorDAO = new CorretorDAO(databaseHelper);
		resultado = corretorDAO.remover(apolice.getCorretor().getId());

		VeiculoDAO veiculoDAO = new VeiculoDAO(databaseHelper);
		resultado = veiculoDAO.remover(apolice.getVeiculo().getId());

		SeguradoDAO seguradoDAO = new SeguradoDAO(databaseHelper);
		resultado = seguradoDAO.remover(apolice.getSegurado().getId());

		database.close();
		
		return resultado != -1;
	}
}
